﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>

using namespace std;


//// 继承——呈现了面向对象程序设计的层次结构
//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//protected:
//	string _name = "peter"; 
//	int _age = 18;
//};
//// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。
//
////    派生类    继承方式  基类
//class Student : public Person
//{
//protected:
//	int _stuid; //学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//
//int main()
//{
//	Student s;
//	Teacher t;
//	s.Print();
//	t.Print();
//	return 0;
//}
//  1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类
//  对象中，但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
//  2. 基类private成员在派生类中是不能被访问，如果基类成员不想在类外直接被访问，但需要在派生类中能访问，
//  就定义为protected。可以看出保护成员限定符是因继承才出现的。
//  3. 实际上面的表格我们进行一下总结会发现，基类的私有成员在子类都是不可见。基类的其他成员在子类的
//  访问方式 == Min(成员在基类的访问限定符，继承方式)，public > protected> private。

 //  三种继承关系下基类成员的各类型成员访问关系的变化  
class Person
{
public:
	void Print()
	{
		cout << "Print()" << endl;
		cout << _name << endl;
		cout << _age << endl;
	}
protected:
	string _name; // 姓名
private:
	int _age; // 年龄
};

//  4. 使用关键字class时默认的继承方式是private，使用struct时默认的继承方式是public，不过最好显示的写出继承方式。
//  5. 在实际运用中一般使用都是public继承，几乎很少使用protetced / private继承，也不提倡使用protetced / private继承，
//  因为protetced / private继承下来的成员都只能在派生类的类里面使用，实际中扩展维护性不强

//class Student : protected Person
//class Student : private Person
class Student : public Person
{
protected:
	int _stunum; // 学号
};

int main()
{
	Student s;
	s.Print();
	return 0;
}